#ifndef __MVS_CORE_PORTING_H__
#define __MVS_CORE_PORTING_H__

#include "mvdef.h"
#include "mvdef_media.h"
#include "mvs_core/mvs_core_ability.h"

MVCXX_EXTERN_BEGIN

/**
 * @brief 设备通道状态查询接口，根据目标通道号，查询可用状态，及最大支持通道数
 * 
 * @param u8_dchn      [in]  目标通道号: 1,2,3,...
 * @param pu8_max_dchn [out] 返回最大通道数 (不管操作结果，非空则必须返回)
 * @return 查询结果
 * - success : MV_EC_SUCCESS      (可用)
 * -  failed : MV_EC_INVALID_ARGS (不可用)
 * @note 单通道默认1，必须可用
 */
mv_s32_t  mvspt_dchn_status(mv_u8_t u8_dchn, mv_u8ptr_t pu8_max_dchn);
/*****************************
 * 
 *   属性操作PortingAPIs
 * 
 ****************************/
typedef enum _type_of_dprops
{
    DPVT_INVALID   =   0, 
    DPVT_BOOL      =   1, ///< bool
    DPVT_NUMBER    =   2, ///< number类型泛型判断，最高支持到sint64; (需要使用浮点型时，根据协议规定进行整形化处理)
    DPVT_STRING    =   3, ///< string
    DPVT_OBJECT    =   4, ///< object
    DP_VALUE_TYPE_NUM,
    DP_VALUE_TYPE_END  =  (DP_VALUE_TYPE_NUM-1),
}mvspt_dprops_vtype_e;

/** GID范围[1,2^8-1]; P/A/EID范围[0,2^8-1]
 * |    8    |    8    |     8     |    8    |
 * | reserve |   GID   | P/A/E/... |   id    |
 */
#define MVSPT_IOTC_DPID(gid,pid)    (mv_u32_t)(((gid&0xff)<<16)|(pid&0xff)|(1<<8)) ///< combine gid&pid into dpid
#define MVSPT_IOTC_DAID(gid,aid)    (mv_u32_t)(((gid&0xff)<<16)|(aid&0xff)|(2<<8)) ///< combine gid&pid into dpid
#define MVSPT_IOTC_DEID(gid,eid)    (mv_u32_t)(((gid&0xff)<<16)|(eid&0xff)|(3<<8)) ///< combine gid&pid into dpid

#define MVSPT_IOTC_GID(dpaeid)      (mv_u8_t)((dpaeid>>16)&0xff)                   ///< get dpid's ori group  id
#define MVSPT_IOTC_PAEID(dpaeid)    (mv_u8_t)((dpaeid)&0xff)                       ///< get dpid's ori prop/action/event id
#define MVSPT_IOTC_IS_PROPS(dpid)   ((mv_bool_t)(((dpid>>8)&0x1)==1)? MV_TRUE : MV_FALSE)
#define MVSPT_IOTC_IS_ACTION(daid)  ((mv_bool_t)(((daid>>8)&0x2)==2)? MV_TRUE : MV_FALSE)
#define MVSPT_IOTC_IS_EVENT(deid)   ((mv_bool_t)(((deid>>8)&0x3)==3)? MV_TRUE : MV_FALSE)

#define MVSPT_DPAE_START(gid) DPAE_##gid##_START=(MVSPT_IOTC_DPID(gid,0)-1)
typedef enum _iotc_gpaeid {
    MVSPT_IOTC_GPAEID_INVALID         = 0,

    /** BASIC INFO GROUP(基础信息类) */
    DGID_IOTC_BASIC_INFO              = 1,
    MVSPT_DPAE_START(DGID_IOTC_BASIC_INFO),
    DPID_BASIC_RUNNING_STATE,             ///< 运行状态
    DPID_BASIC_DEV_VERSION_INFO,          ///< 设备版本信息
    DPID_BASIC_MODULE_VERSION_INFO,       ///< 模块版本信息
    DPID_BASIC_HW_VERSION_INFO,           ///< 硬件版本信息
    DPID_BASIC_DEV_MODEL_NAME,            ///< 设备Model名称
    DPID_BASIC_LANPASS_PERMISSION,        ///< Lanpass功能权限（SDK内部处理）
    DPID_BASIC_MS_LINES_INFO,             ///< 流媒体连接数信息（SDK内部处理）
    DPID_BASIC_LOG_PARAM,                 ///< LOG控制参数（SDK内部处理）
    MVSPT_IOTC_BASIC_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_BASIC_INFO, 0xff),
    DAID_BASIC_OTA,                       ///< 远程升级OTA（SDK内部处理）
    DAID_BASIC_RESTORE,                   ///< 恢复出厂设置并解绑
    DAID_BASIC_REBOOT,                    ///< 重启设备
    MVSPT_IOTC_BASIC_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_BASIC_INFO, 0xff),
    MVSPT_IOTC_BASIC_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_BASIC_INFO, 0xff),

    /** SDCARD GROUP(存储卡及录像类) */
    DGID_IOTC_SDCARD                  = 2,
    MVSPT_DPAE_START(DGID_IOTC_SDCARD),
    DPID_SD_STATUS,                       ///< 存储卡状态
    DPID_SD_CAPACITY,                     ///< 存储卡容量
    DPID_SD_FORMAT_STATE,                 ///< 格式化状态
    DPID_RECORD_MODE,                     ///< 录像模式
    DPID_RECORD_QUALITY,                  ///< 录像质量
    DPID_RECORD_AUDIO,                    ///< 录像音频
    DPID_RECORD_LOOP,                     ///< 循环录像
    MVSPT_IOTC_SDCARD_PID_MAX         = MVSPT_IOTC_DPID(DGID_IOTC_SDCARD, 0xff),
    DAID_SD_FORMAT,                       ///< 格式化TF卡
    DAID_RECORD_SEG_STATE_CTRL,           ///< 操作目标录像段落
    MVSPT_IOTC_SDCARD_AID_MAX         = MVSPT_IOTC_DAID(DGID_IOTC_SDCARD, 0xff),
    MVSPT_IOTC_SDCARD_EID_MAX         = MVSPT_IOTC_DEID(DGID_IOTC_SDCARD, 0xff),

    /** TIME GROUP(时间类) */
    DGID_IOTC_TIME                    = 3,
	MVSPT_DPAE_START(DGID_IOTC_TIME),
    DPID_TIMEZONE,                        ///< 时区
    DPID_TIME_FORMAT,                     ///< 时间制式
    DPID_CUR_TIME,                        ///< 当前时间
    DPID_DST,                             ///< 夏令时: 0=disable, +N=N hours
    MVSPT_IOTC_TIME_PID_MAX           = MVSPT_IOTC_DPID(DGID_IOTC_TIME, 0xff),
    MVSPT_IOTC_TIME_AID_MAX           = MVSPT_IOTC_DAID(DGID_IOTC_TIME, 0xff),
    MVSPT_IOTC_TIME_EID_MAX           = MVSPT_IOTC_DEID(DGID_IOTC_TIME, 0xff),

    /** NETWORK GROUP(网络类) */
    DGID_IOTC_NETWORK                 = 4,
	MVSPT_DPAE_START(DGID_IOTC_NETWORK),
    DPID_NET_STATIC_IP,                   ///< 静态IP配置
    DPID_NET_NETWORK_MODE,                ///< 当前网络模式
    DPID_NET_MODULE_SIGNAL_LEVEL,         ///< 模块信号强度
    DPID_NET_WIFI_AP_SSID,                ///< WiFi热点SSID
    DPID_NET_WIFI_STA_SSID,               ///< WiFi路由SSID
    DPID_NET_WIFI_AP_PWD,                 ///< WiFi热点PASSWORD
    MVSPT_IOTC_NETWORK_PID_MAX        = MVSPT_IOTC_DPID(DGID_IOTC_NETWORK, 0xff),
    DAID_NET_CONFIG,                      ///< 更改网络配置信息（SDK内部处理）
    MVSPT_IOTC_NETWORK_AID_MAX        = MVSPT_IOTC_DAID(DGID_IOTC_NETWORK, 0xff),
    MVSPT_IOTC_NETWORK_EID_MAX        = MVSPT_IOTC_DEID(DGID_IOTC_NETWORK, 0xff),

    /** LIGHT GROUP(灯类) */
    DGID_IOTC_LIGHT                   = 5,
	MVSPT_DPAE_START(DGID_IOTC_LIGHT),
    DPID_LIGHT_FLOODLIGHT_SW,             ///< 白光灯-开关
    DPID_LIGHT_FLOODLIGHT_STATUS,         ///< 白光灯-状态
    DPID_LIGHT_FLOODLIGHT_LIGHTNESS,      ///< 白光灯-亮度
    DPID_LIGHT_FLOODLIGHT_SENSITIVITY,    ///< 白光灯-开灯灵敏度
    DPID_LIGHT_SCHEDULE,                  ///< 定时灯控信息
    DPID_LIGHT_INDICATOR_SW,              ///< 状态指示灯-开关
    MVSPT_IOTC_LIGHT_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_LIGHT, 0xff),
    MVSPT_IOTC_LIGHT_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_LIGHT, 0xff),
    MVSPT_IOTC_LIGHT_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_LIGHT, 0xff),

    /** PTZ GROUP(云台,变焦类) */
    DGID_IOTC_PTZ                     = 6,
	MVSPT_DPAE_START(DGID_IOTC_PTZ),
    DPID_PT_PRESETS_USED_NUM,             ///< 云台预置位已使用数量
    DPID_PT_CRUISE_INFO,                  ///< 云台巡航信息
    DPID_PT_AUTO_RECAL,                   ///< 定时校准
    DPID_PT_SPEED_H,                      ///< 云台水平方向速度
    DPID_PT_SPEED_V,                      ///< 云台垂直方向速度
    DPID_PT_OBJ_TRACKING_SW,              ///< 移动追踪开关
    MVSPT_IOTC_PTZ_PID_MAX            = MVSPT_IOTC_DPID(DGID_IOTC_PTZ, 0xff),
    DAID_PT_STEP_CTRL,                    ///< 云台步进控制
    DAID_PT_PRESETS_CTRL,                 ///< 云台预置位控制
    DAID_PT_HOME_POSITION,                ///< 云台看守位开关
    DAID_ZOOM_CTRL,                       ///< 变倍变焦控制
    DAID_PT_RECAL,                        ///< 云台手动校准
    DAID_PT_PHYSICAL_PRIVACY_MASK,        ///< 物理隐私遮罩控制开关
    MVSPT_IOTC_PTZ_AID_MAX            = MVSPT_IOTC_DAID(DGID_IOTC_PTZ, 0xff),
    MVSPT_IOTC_PTZ_EID_MAX            = MVSPT_IOTC_DEID(DGID_IOTC_PTZ, 0xff),

    /** AUDIO GROUP(声音类) */
    DGID_IOTC_AUDIO                   = 7,
	MVSPT_DPAE_START(DGID_IOTC_AUDIO),
    DPID_AUDIO_DEV_AI_VOLUME,             ///< 设备采集音量控制
    DPID_AUDIO_DEV_AO_VOLUME,             ///< 设备播放音量控制
    DPID_AUDIO_LANGUAGE_TYPE,             ///< 设备语言类型
    DPID_AUDIO_TIPS_PROMPT_SW,            ///< 提示音开关
    DPID_AUDIO_ENCODING_FORMAT,           ///< 设备音频编码格式设置
    DPID_AUDIO_QUICK_REPLY_CONTENT,       ///< 快捷回复内容(列表)
    MVSPT_IOTC_AUDIO_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_AUDIO, 0xff),
    DAID_AUDIO_QUICK_REPLY_PLAY,          ///< 播放快捷回复提示音
    MVSPT_IOTC_AUDIO_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_AUDIO, 0xff),
    MVSPT_IOTC_AUDIO_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_AUDIO, 0xff),

    /** VIDEO GROUP(视频,画面类) */
    DGID_IOTC_VIDEO                   = 8,
	MVSPT_DPAE_START(DGID_IOTC_VIDEO),
    DPID_VIDEO_FLIP_MODE,                 ///< 画面方向变换方式
    DPID_VIDEO_ISP_SHARPNESS,             ///< 锐度调节
    DPID_VIDEO_ISP_BRIGHTNESS,            ///< 亮度调节
    DPID_VIDEO_ISP_CONTRAST,              ///< 对比度调节
    DPID_VIDEO_ISP_SATURATION,            ///< 饱和调节
    DPID_VIDEO_ISP_NIGHTVISION,           ///< 夜视控制（开/关/自动）
    DPID_VIDEO_ISP_ANTI_FLICKER_MODE,     ///< 抗闪烁
    DPID_VIDEO_ENCODING_FORMAT,           ///< 视频编码格式
    MVSPT_IOTC_VIDEO_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_VIDEO, 0xff),
    DAID_IMG_ROTATION,                    ///< 图像翻转
    MVSPT_IOTC_VIDEO_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_VIDEO, 0xff),
    MVSPT_IOTC_VIDEO_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_VIDEO, 0xff),

    /** OSD GROUP(OSD类) */
    DGID_IOTC_OSD                     = 9,
	MVSPT_DPAE_START(DGID_IOTC_OSD),
    DPID_OSD_TIME_MARK_SW,                ///< 时间水印开关
    MVSPT_IOTC_OSD_PID_MAX            = MVSPT_IOTC_DPID(DGID_IOTC_OSD, 0xff),
    MVSPT_IOTC_OSD_AID_MAX            = MVSPT_IOTC_DAID(DGID_IOTC_OSD, 0xff),
    MVSPT_IOTC_OSD_EID_MAX            = MVSPT_IOTC_DEID(DGID_IOTC_OSD, 0xff),

    /** ALARM GROUP(警戒类-协议1) */
    DGID_IOTC_ALARM                   = 10,
	MVSPT_DPAE_START(DGID_IOTC_ALARM),
    DPID_ALARM_MAIN_SW,                   ///< 报警总开关
    DPID_ALARM_SOUND_SW,                  ///< 报警音开关
    DPID_ALARM_SOUND_TYPE,                ///< 报警音类型（标配/自定义）
    DPID_ALARM_MT_SENSITIVITY,            ///< 移动侦测灵敏度
    DPID_ALARM_MT_SW,                     ///< 移动报警开关
    DPID_ALARM_TIMER_INFO,                ///< 报警时间段
    DPID_ALARM_MT_AREA,                   ///< 报警区域
    DPID_ALARM_FLIGHT_WARN_SW,            ///< 亮灯警示开关
    DPID_ALARM_PA_SW,                     ///< 主动报警开关
    DPID_ALARM_PA_CUSTOM_ATTR,            ///< 主动报警自定义属性（推送内容, ...）
    DPID_ALARM_LOWPOW_ALARM_SW,           ///< 低电量报警开关
    MVSPT_IOTC_ALARM_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_ALARM, 0xff),
    DAID_MANUALLY_ALARM,                  ///< 手动报警
    MVSPT_IOTC_ALARM_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_ALARM, 0xff),
    MVSPT_IOTC_ALARM_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_ALARM, 0xff),

    /** POWER GROUP(电源类) */
    DGID_IOTC_POWER                   = 11,
	MVSPT_DPAE_START(DGID_IOTC_POWER),
    DPID_POWER_STATE,                     ///< 供电状态
    DPID_BATTERY_SOC,                     ///< 电池电量状态
    DPID_BATTERY_LOWPOWER_THR,            ///< 电池低电量状态阈值（影响低电量报警, ...等）
    MVSPT_IOTC_POWER_PID_MAX          = MVSPT_IOTC_DPID(DGID_IOTC_POWER, 0xff),
    MVSPT_IOTC_POWER_AID_MAX          = MVSPT_IOTC_DAID(DGID_IOTC_POWER, 0xff),
    MVSPT_IOTC_POWER_EID_MAX          = MVSPT_IOTC_DEID(DGID_IOTC_POWER, 0xff),

    /** FACTORY TEST (厂测类，SDK内部处理） */
    DGID_IOTC_FACTORY_TEST            = 12,

    /** CLOUD SERVICE(云服务类，SDK内部使用) */
    DGID_IOTC_CLOUDS                  = 13,

    /** ALERT GROUP(警戒类-协议2) */
    DGID_IOTC_ALERT_V2                = 14,
	MVSPT_DPAE_START(DGID_IOTC_ALERT_V2),
    DPID_ALERT_V2_FILTER_SW,                 ///< 报警过滤器开关
    DPID_ALERT_V2_SCHEDULE,                  ///< 报警时间段
    DPID_ALERT_V2_SOUND,                     ///< 报警音全局配置
    DPID_ALERT_V2_WARNING_LIGHT,             ///< 报警灯全局配置(WL)
    DPID_ALERT_V2_AREA,                      ///< 区域设置（包含ROI、EFENCE、LINE-CROSSING、STAY）
    DPID_ALERT_V2_SUM_PROPS_RESERVE_END  = DPID_ALERT_V2_FILTER_SW + 16,
    DPID_ALERT_V2_EVT_ATTR_MD,               ///< 移动事件属性(对应过滤器开关、灵敏度、报警音、报警灯)
    DPID_ALERT_V2_EO_SOUND_MD,               ///< 报警音EO(event-object)局部配置：移动事件-对象
    DPID_ALERT_V2_EO_WL_MD,                  ///< 报警灯EO(event-object)局部配置：移动事件-对象
    DPID_ALERT_V2_EVT_ATTR_STAY,             ///< 逗留事件属性
    DPID_ALERT_V2_EO_SOUND_STAY,             ///< 报警音EO(event-object)局部配置：逗留事件-对象
    DPID_ALERT_V2_EO_WL_STAY,                ///< 报警灯EO(event-object)局部配置：逗留事件-对象
    DPID_ALERT_V2_EVT_ATTR_EFENCE_ENTER,     ///< 区域入侵事件属性
    DPID_ALERT_V2_EO_SOUND_EFENCE_ENTER,     ///< 报警音EO(event-object)局部配置：区域入侵事件-对象
    DPID_ALERT_V2_EO_WL_EFENCE_ENTER,        ///< 报警灯EO(event-object)局部配置：区域入侵事件-对象
    DPID_ALERT_V2_EVT_ATTR_EFENCE_EXIT,      ///< 区域离开事件属性
    DPID_ALERT_V2_EO_SOUND_EFENCE_EXIT,      ///< 报警音EO(event-object)局部配置：区域离开事件-对象
    DPID_ALERT_V2_EO_WL_EFENCE_EXIT,         ///< 报警灯EO(event-object)局部配置：区域离开事件-对象
    DPID_ALERT_V2_EVT_ATTR_LC,               ///< 越线事件属性
    DPID_ALERT_V2_EO_SOUND_LC,               ///< 报警音EO(event-object)局部配置：越线事件-对象
    DPID_ALERT_V2_EO_WL_LC,                  ///< 报警灯EO(event-object)局部配置：越线事件-对象
    DPID_ALERT_V2_EVT_ATTR_BABYCRY,          ///< 婴儿哭声事件属性

    DPID_ALERT_V2_OBJ_ATTR_ANYMOUS,          ///< 非细分物体属性（对应过滤器开关、分类大小限制、置信度、画框、...）
    DPID_ALERT_V2_OBJ_ATTR_PERSON,           ///< 人形属性（分类大小限制、置信度、画框、...）
    DPID_ALERT_V2_OBJ_ATTR_SMOKE,            ///< 烟雾属性（分类大小限制、置信度、画框、...）
    MVSPT_IOTC_ALERT_V2_PID_MAX       = MVSPT_IOTC_DPID(DGID_IOTC_ALERT_V2, 0xff),
    DAID_ALERT_V2_MANUALLY_ALARM,            ///< 手动报警
    MVSPT_IOTC_ALERT_V2_AID_MAX       = MVSPT_IOTC_DAID(DGID_IOTC_ALERT_V2, 0xff),
    MVSPT_IOTC_ALERT_V2_EID_MAX       = MVSPT_IOTC_DEID(DGID_IOTC_ALERT_V2, 0xff),

    /** EXT-PROTOCOL GROUP(扩展协议类) */
    DGID_IOTC_EXTPROT                 = 15,
	MVSPT_DPAE_START(DGID_IOTC_EXTPROT),
    DPID_EXTPROT_ONVIF_SW,               ///< ONVIF协议开关
    DPID_EXTPROT_RTSP_AUDIO_SW,          ///< RTSP音频流开关
    DPID_EXTPROT_RTMP_PUSH_SW,           ///< RTMP推流开关
    DPID_EXTPROT_RTMP_PUSH_URL,          ///< RTMP推流地址
    MVSPT_IOTC_EXTPROT_PID_MAX        = MVSPT_IOTC_DPID(DGID_IOTC_EXTPROT, 0xff),
    MVSPT_IOTC_EXTPROT_AID_MAX        = MVSPT_IOTC_DAID(DGID_IOTC_EXTPROT, 0xff),
    MVSPT_IOTC_EXTPROT_EID_MAX        = MVSPT_IOTC_DEID(DGID_IOTC_EXTPROT, 0xff),

    /** BASE-STATION GROUP(基站/中继类) */
    DGID_IOTC_BASE_STATION            = 16,
	MVSPT_DPAE_START(DGID_IOTC_BASE_STATION),
    DPID_BS_BASIC_ACCESS_POINT,          ///< 基站::基本属性::接入点信息
    DPID_BS_DEVSCR_WAN_CUTOFF_SCHEDULE,  ///< 基站::设备安全::互联网切断(定时)计划
    DPID_BS_DEVSCR_WAN_CUTOFF_STATE,     ///< 基站::设备安全::实时互联网切断状态
    MVSPT_IOTC_BASE_STATION_PID_MAX     = MVSPT_IOTC_DPID(DGID_IOTC_BASE_STATION, 0xff),
    DAID_BS_DEVSET_PREINFO,              ///< 基站::套装::套装预设设备信息(SDK内部处理)
    DAID_BS_DEVMGM_DEVLIST,              ///< 基站::设备管理::设备列表
    DAID_BS_DEVMGM_BLOCK,                ///< 基站::设备管理::设备拉黑
    MVSPT_IOTC_BASE_STATION_AID_MAX     = MVSPT_IOTC_DAID(DGID_IOTC_BASE_STATION, 0xff),
    MVSPT_IOTC_BASE_STATION_EID_MAX     = MVSPT_IOTC_DEID(DGID_IOTC_BASE_STATION, 0xff),

    /** LOWPOWER GROUP(低功耗类) */
    DGID_IOTC_BASE_LOWPOWER           = 17,
    MVSPT_DPAE_START(DGID_IOTC_BASE_LOWPOWER),
    DPID_LOWPOWER_MODE,                  ///< 低功耗模式[abl_lowpower_mode_bmpc32_e]
    DPID_LOWPOWER_SMART_ATTR,            ///< 智能供电模式详细属性(包含时段，时段外(支持)模式等)
    MVSPT_IOTC_LOWPOWER_PID_MAX   = MVSPT_IOTC_DPID(DGID_IOTC_BASE_LOWPOWER, 0xff),
    MVSPT_IOTC_LOWPOWER_AID_MAX   = MVSPT_IOTC_DAID(DGID_IOTC_BASE_LOWPOWER, 0xff),
    MVSPT_IOTC_LOWPOWER_EID_MAX   = MVSPT_IOTC_DEID(DGID_IOTC_BASE_LOWPOWER, 0xff),

    /** CUSTOM GROUP(客户自定义类) */
    DGID_IOTC_CUSTOM                  = 250,
	MVSPT_DPAE_START(DGID_IOTC_CUSTOM),
    MVSPT_IOTC_CUSTOM_PID_MAX         = MVSPT_IOTC_DPID(DGID_IOTC_CUSTOM, 0xff),
    MVSPT_IOTC_CUSTOM_AID_MAX         = MVSPT_IOTC_DAID(DGID_IOTC_CUSTOM, 0xff),
    MVSPT_IOTC_CUSTOM_EID_MAX         = MVSPT_IOTC_DEID(DGID_IOTC_CUSTOM, 0xff),

    MVSPT_IOTC_GPAEID_MAX             = 0xffffffff,
}mvspt_iotc_gpaeid_e;

/**
 * @brief DPROP类型检查
 * 
 * @param u32_dpid [in] 属性ID [DPID_XXXX]
 * @return 类型结果
 * - success : [mvspt_dprops_vtype_e] 
 * -  failed : MV_EC_NOT_SUPPORT (不支持)
 *             else
 */
mv_s32_t  mvspt_dprops_type     (mv_u32_t u32_dpid);
/**
 * @brief DPROP获取
 * 
 * @param u8_dchn  [in] 设备通道
 * @param u8_sid   [in] 会话ID
 * @param u32_dpid [in] 属性ID [DPID_XXXX]
 * @param pcache   [out] 属性值缓冲区
 * @param s32_size [in] 缓冲区大小
 * @return 获取结果
 * - success : >=0 属性值长度
 * -  failed : MV_EC_NOT_SUPPORT (不支持)
 *             else
 * 
 * @note value泛型，根据dpid的类型，对pcache进行强转使用
 *       1. 布尔类型: (mv_bool_t*)
 *       1. 数值类型: (mv_s64ptr_t)
 *       2. 字符串和对象类型: (mv_v8ptr_t)
 */
mv_s32_t  mvspt_dprops_get_value(mv_u8_t u8_dchn, mv_u8_t u8_sid, mv_u32_t u32_dpid, mv_vptr_t pcache, mv_s32_t s32_size);
/**
 * @brief DPROP设置
 * 
 * @param u8_dchn  [in] 设备通道
 * @param u8_sid   [in] 会话ID
 * @param u32_dpid [in] 属性ID [DPID_XXXX]
 * @param cpcache  [in] 属性值缓冲区
 * @param s32_size [in] 缓冲区大小
 * @return 设置结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_NOT_SUPPORT (不支持)
 *             MV_EC_READ_ONLY   (只读属性)
 *             MV_EC_INVALID_ARGS(非法参数)
 *             else
 * 
 * @note value泛型，根据dpid的类型，对pcache进行强转使用
 *       1. 布尔类型: (mv_bool_t*)
 *       1. 数值类型: (mv_s64ptr_t)
 *       2. 字符串和对象类型: (mv_v8ptr_t)
 */
mv_s32_t  mvspt_dprops_set_value(mv_u8_t u8_dchn, mv_u8_t u8_sid, mv_u32_t u32_dpid, mv_cvptr_t cpcache, mv_s32_t s32_size);
/*****************************
 * 
 *   动作执行PortingAPIs
 * 
 ****************************/
/**
 * @brief 动作执行请求处理接口
 * 
 * @param u8_dchn    [in] 设备通道
 * @param u8_sid     [in] 会话ID
 * @param u32_daid   [in] 动作ID
 * @param pin        [in] 输入参数数据(json)
 * @param s32_inlen  [in] 输入参数数据长度
 * @param pout      [out] 输出参数数据(json)
 * @param s32_outmax [in] 输出参数数据最大长度
 * @return 处理结果
 * - success : >= 0 (输出参数长度) 
 * -  failed : MV_EC_NOT_SUPPORT
 *             MV_EC_INVALID_ARGS
 *             MV_EC_ACTION_BUSY
 *             MV_EC_FAILED
 */
mv_s32_t  mvspt_dact_resolve   (mv_u8_t u8_dchn, mv_u8_t u8_sid, mv_u32_t u32_daid, mv_vptr_t pin, mv_s32_t s32_inlen, mv_vptr_t pout, mv_s32_t s32_outmax);
/*****************************
 * 
 *   消息事件PortingAPIs
 * 
 ****************************/
typedef struct _pt_event_args
{
    mv_u8_t u8_from;         ///< [1=App; 2=Dev]
    mv_u8_t u8_iotc_way;     ///< [1=LAN; 2=WAN]
    mv_u8_t u8_io_act;       ///< 特定事件种类的IO分类
    mv_u8_t u8_sub_evt;      ///< 特定事件种类的子分类
}mvspt_event_arg_t;
typedef enum _pt_two_way_video_event_idx
{
    MVSPT_SUBEVT_2WV_CALL   = 0, ///< 呼叫接入
    MVSPT_SUBEVT_2WV_HANGUP = 1, ///< 挂断通话
    MVSPT_SUBEVT_2WV_UPDATE = 2, ///< 通话中，视频或音频下发开关有改变
}mvspt_subevt_2wv_idx_e;
typedef struct _pt_two_way_video_event_args
{
    mvspt_event_arg_t st_subcomm;
    mv_u64_t          u64_uid;          ///< UID
    mv_u32_t          u32_callid;       ///< Call随机ID (0=对端主动请求；非0=本端曾主动发起，需要判断是否由本机发起且仍然有效，无效则拒绝)
    mv_u8_t           u8_sid;           ///< 关联session id (特别的，0=非连接来源消息)
    mv_u8_t           u8_downstatus;    ///< 0x10=with video; 0x20=with audio
}mvspt_subevt_2wv_args_t;
typedef enum _pt_event_idx
{
	MVSPT_EVENT_ACCOUNT_BINDING,        ///< 账号绑定中事件
	MVSPT_EVENT_ACCOUNT_BIND_OK,        ///< 账号绑定成功事件
	MVSPT_EVENT_ACCOUNT_BIND_FAILED,    ///< 账号绑定失败事件（其他原因）
	MVSPT_EVENT_ACCOUNT_BIND_REFUSE,    ///< 账号绑定失败事件（已被绑定）
	MVSPT_EVENT_ACCOUNT_BIND_EXPIRED,   ///< 账号绑定失败事件（TOKEN过期）
	MVSPT_EVENT_ACCOUNT_UNBINDED,       ///< 账号已解绑(被离线解绑了)
    MVSPT_EVENT_BINDING_EXPIRED,        ///< 绑定状态超时，不处理任何新的绑定操作（请重置重新进入绑定状态）
	MVSPT_EVENT_LAN_BINED,              ///< 局域网（离线方式）绑定成功事件

	MVSPT_EVENT_IOTC_DISCONNECT,        ///< 与OT服务器连接断开
	MVSPT_EVENT_IOTC_CONNECT_TRYING,    ///< 正尝试连接OT服务器
	MVSPT_EVENT_IOTC_CONNECTED,         ///< 已成功连接OT服务器

	MVSPT_EVENT_IOTC_LAN_CONNECT,       ///< 新的局域网连接请求接入（返回fail类型结果则拒绝接入）
	MVSPT_EVENT_IOTC_LAN_DISCONNECT,    ///< 一个局域网连接退出

	MVSPT_EVENT_IOTC_WAN_CONNECT,       ///< 新的互联网连接请求接入（返回fail类型结果则拒绝接入）
	MVSPT_EVENT_IOTC_WAN_DISCONNECT,    ///< 一个互联网连接退出

    MVSPT_EVENT_CLOUDS_REC_NEW,         ///< 云存储服务新录像过程开始
    MVSPT_EVENT_CLOUDS_REC_FIN,         ///< 云存储服务录像结束

    /**
     * @brief 双向视频请求
     * @return 事件处理结果（仅针对CALL，其他类型返回值均忽略）
     * - success : MV_EC_SUCCESS (允许接入)
     * -  failed : MV_EC_ACTION_BUSY （繁忙，稍后重试）
     *             MV_EC_ABORT   (拒绝接入)
     *             MV_EC_RESOURCE_LEAK (达到上限，(没有通过设置SDK内部限制数来自动过滤))
     */
    MVSPT_EVENT_TWO_WAY_VIDEO,          ///< 双向视频请求 [mvspt_subevt_2wv_args_t*], 返回fail类型结果则拒绝接入

    MVSPT_EVENT_SYSTIME_UPDATED,        ///< 系统时间被SDK更新了(p_args为mv_time_t*类型数据引用，SDK拿到的标准时间戳)
}mvspt_event_idx_e;
/**
 * @brief 消息处理接口
 * 
 * @param s32_event_idx [in] 主消息类型[mvspt_event_idx_e]
 * @param p_args        [in] 消息附带数据
 * @param s32_len       [in] 数据长度
 * @return 消息处理结果
 * - success : MV_EC_SUCCESS
 * -  bypass : MV_EC_IGNORE
 * -  failed : else
 */
mv_s32_t  mvspt_event_handler(mv_s32_t s32_event_idx, mv_vptr_t p_args, mv_s32_t s32_len);

/*****************************
 * 
 *   绑定相关操作PortingAPIs
 * 
 ****************************/
/**
 * @brief PINCODE绑定模式，PINCODE刷新
 * 
 * @param u16_pincode [in] 绑定配对码
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * 
 * @note pincode为0时，转义表示停止播报
 * @note 存在pincode需要播报时，会间隔约2秒调用一次，外部根据实际设计自行决定播放间隔(请不要阻塞处理)
 */
mv_s32_t  mvspt_binding_pincode_show(mv_u16_t u16_pincode);
/**
 * @brief WPS绑定模式，物理验证检测
 * 
 * @return 验证结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * 
 * @note 不要阻塞，SDK内置有检测间隔，不需要在这里循环检测
 */
mv_s32_t  mvspt_binding_wps_check(mv_void_t);
/*****************************
 * 
 *   网络相关操作PortingAPIs
 * 
 ****************************/
typedef enum _pt_network_mode
{
	MVSPT_NET_MODE_INVALID        =  0,
	MVSPT_NET_MODE_MONITOR        =  MVSPT_NET_MODE_INVALID,
	MVSPT_NET_MODE_AP             =  1,   ///< AP mode establishing
	MVSPT_NET_MODE_STA            =  2,   ///< Station connecting
#define MVSPT_NET_MODE_WIFI_MASK   0x7    ///< === WiFi mode 以上以枚举形式表示
    /** 以下以bitmap形式表示 */
	MVSPT_NET_MODE_ETH            =  8,   ///< Ethernet
	MVSPT_NET_MODE_LTE            = 16,   ///< 2G / 3G / 4G / 5G / ...
	MVSPT_NET_MODE_BLE            = 32,   ///< Bluetooth
#define MVSPT_NET_MODE_OTH_MASK  ~(0x07)  ///< === Other mode
}mvspt_network_mode_e;

typedef struct _pt_network_conf
{
	mv_u8_t u8_mode;               ///< 模式 [mvspt_network_mode_e]
    mv_u8_t au8_reserve[3];        ///< （保留）
    union {
        mv_v8_t av8_sta_ssid[68];  ///< STA模式ssid
        mv_v8_t av8_ap_ssid[40];   ///< AP模式ssid
    };
    union {
        mv_v8_t av8_sta_pwd [68];  ///< STA模式pwd(请不要明文存储)
        mv_v8_t av8_ap_pwd  [40];  ///< AP模式pwd(请不要明文存储)
    };
}mvspt_network_conf_t;
/**
 * @brief 网络模式切换操作（一般是STA）
 * 
 * @param pstru_cfg [in] 目标配置信息
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_FAILED
 * 
 * @note 因为部分切换请求内部需要响应时间，所以外部实现时，异步延时1~2秒左右再进行切换
 */
mv_s32_t  mvspt_network_config(mvspt_network_conf_t *pstru_cfg);
/**
 * @brief 当前网络状态查询
 * 
 * @param av8_main_netif [out] 当前网络模式局域网状态主网络节点名称 \n(注意：需要判断NULL入参，部分场景此接口不需要获取网络节点名称)
 * @return 查询结果
 * - success : 模式flags bitmap[mvspt_network_mode_e]
 * -  failed : MV_EC_FAILED
 * @note 一般是在网络模式切换返回成功后，调用此接口轮询网络状态，直到拿到目标状态为止
 */
mv_s32_t  mvspt_network_mode  (mv_v8_t av8_main_netif[16]);
/*****************************
 * 
 *   透传IOTC信息PortingAPIs
 * 
 ****************************/
/** IOTC类型透传信息处理接口(配套响应接口) */
mv_s32_t  mvspt_iotc_service_qa_analyzer(
	mv_u8_t    u8_dchn, mv_u8_t  u8_sid,
	mv_v8ptr_t pv8_msg, mv_s32_t s32_len, mv_vptr_t pck,
	mv_s32_t(*f_data_sender)(mv_v8ptr_t pv8_data, mv_s32_t s32_len, mv_vptr_t pck));

/*******************************
 *    实时媒体数据 Porting APIs
 ******************************/
typedef struct _pano_attr
{
	mv_u8_t  u8_pano_type;          ///< 全景类型，0: invalid; 1: 180 pano; 2: 360 pano
	mv_u32_t u32_pano_x;            ///< 全景校正圆X坐标(pixel)
	mv_u32_t u32_pano_y;            ///< 全景校正圆Y坐标(pixel)
	mv_u32_t u32_pano_r;            ///< 全景校正圆R半径(pixel)
}mvspt_pano_attr_t;

typedef enum _media_vquality
{
	MVSPT_VQLTY_INVALD  = 0x00,
	MVSPT_VQLTY_SD      = 0x01,     ///< 标清
	MVSPT_VQLTY_HD      = 0x02,     ///< 高清
	MVSPT_VQLTY_FHD     = 0x04,     ///< 超清
}mvspt_vquality_e;

typedef enum _media_atrack
{
	MVSPT_ATRACK_INVALD = 0x00,
	MVSPT_ATRACK_MAIN   = 0x01,
	MVSPT_ATRACK_MAX,
}mvspt_atrack_e;

typedef struct _pt_media_stream_info
{
	/** prepare请求参数 */
	mv_u8_t           u8_dchn;           ///< 设备通道
	mvspt_vquality_e  e_vqlty;           ///< 视频画质通道
	mvspt_atrack_e    e_atrack;          ///< 音频通道
	mv_s64_t          s64_ts_pre_msec;   ///< 预录前向定位时长
	/** prepare成功后需要刷新和持续使用的信息 */
	mv_vptr_t         phdl_video;        ///< 视频通道句柄地址
	mv_vptr_t         phdl_audio;        ///< 音频通道句柄地址
	mvdef_media_bp_t  stru_mbp;          ///< 音视频基础属性
	mvspt_pano_attr_t stru_pano;         ///< 全景校正参数
	mv_s32_t          s32_usr_data_len;  ///< 用户数据长度
	mv_vptr_t         p_usr_data;        ///< 用户数据
}mvspt_msi_t;

/**
 * @brief 获取支持的画质通道(bitmap)
 * 
 * @param u8_dchn [in]  设备通道
 * @return 画质通道(bitmap) [mvspt_vquality_e]
 */
mv_s32_t mvspt_media_valid_vqlty(mv_u8_t u8_dchn);
typedef enum _pt_media_stream_qos
{
    MVSPT_MSQOS_ACT_INVALID = 0x0,
    MVSPT_MSQOS_UP          = 0x1, ///< 质量上调建议
    MVSPT_MSQOS_DOWN        = 0x2, ///< 质量下调建议
    MVSPT_MSQOS_KEEP        = 0x4, ///< 质量保持建议
    MVSPT_MSQOS_RST         = 0x8, ///< 质量调节复位
}mvspt_msqos_e;
/**
 * @brief 媒体流通道QoS调整
 * 
 * @param u8_dchn    [in] 设备通道
 * @param e_vqlty    [in] 视频画质通道
 * @param e_msqos_lv [in] 调整建议
 * @return 操作结果
 * - success : MV_EC_SUCCESS (成功)
 * -  failed : MV_EC_IGNORE  (该方向的继续调整无法实现)
 *           : MV_EC_ABORT   (中止本次调整操作)
 */
mv_s32_t mvspt_media_stream_qos(mv_u8_t u8_dchn, mvspt_vquality_e e_vqlty, mvspt_msqos_e e_msqos_act);
/**
 * @brief 按照预录时长，(重新)定位和初始化取音视频数据句柄资源
 * 
 * @param u8_sid [in]  会话ID
 * @param pmsi   [in]  音视频流通道资源句柄
 * @param pmdi   [out] 音视频数据结构描述
 * @return 准备结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_RETRY   (同步失败，或无准备好的数据帧)
 *             MV_EC_ABORT   (其他异常，需要中断操作)
 */
mv_s32_t  mvspt_media_stream_prepare(mv_u8_t u8_sid, mvspt_msi_t *pmsi, mvdef_media_dbi_t *pmdi);
/**
 * @brief 取出下一帧数据
 * 
 * @param u8_sid [in]  会话ID
 * @param pmsi   [in]  音视频流通道资源句柄
 * @param pmdi   [out] 音视频数据结构描述
 * @return 操作结果 
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_RETRY   (同步失败，或无准备好的数据帧)
 *             MV_EC_ABORT   (其他异常，需要中断操作)
 */
mv_s32_t  mvspt_media_stream_get_next_frame(mv_u8_t u8_sid, mvspt_msi_t *pmsi, mvdef_media_dbi_t *pmdi);
/**
 * @brief 释放句柄资源
 * 
 * @param u8_sid [in]  会话ID
 * @param pmsi   [in]  音视频流通道资源句柄
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * @note  “mvspt_media_stream_prepare”和“mvspt_media_stream_get_next_frame” \n
 *        返回ABORT时，均需要调用此接口释放资源，再重新进行下一次操作
 */
mv_s32_t  mvspt_media_stream_dispose(mv_u8_t u8_sid, mvspt_msi_t *pmsi);
/**
 * @brief 处理收到的一帧数据（包含音、视频）
 * 
 * @param u8_dchn [in] 设备通道
 * @param u8_sid  [in] 会话ID
 * @param pmpb    [in] 媒体基本参数
 * @param pmdbi   [in] 此媒体数据帧基本信息
 * @return 处理结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_ABORT   (下行拒绝=拒收，挂断)
 *             else
 */
mv_s32_t  mvspt_media_stream_resolve_next_frame(mv_u8_t u8_dchn, mv_u8_t u8_sid, const mvdef_media_bp_t *pmpb, const mvdef_media_dbi_t *pmdbi);

/*******************************
 *    异步截图/关键帧抓取 Porting APIs
 * 一般调用流程是：
 *   1. 调用mvspt_jpeg_snapshot_async通知需要截图/调用mvspt_iframe_snapshot_async通知需要抓取关键帧
 *   2. 等到需要图片数据时，调用mvspt_snapshot_get_data获取步骤1中通知要抓取的图片/视频数据
 *   3. 成功获取数据，并使用完成后，会调用mvspt_snapshot_release通知释放数据缓冲区和文件
 ******************************/
/**
 * @brief 缩略图抓取请求（异步）
 * 
 * @param cpv8_filepath   [in] 目标图片文件全路径
 * @param s32_prefer_size [in] 图片容量大小限制推荐值
 * @return 请求执行结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * 
 * @note (1)缩略图分辨率不限制，格式为.jpg，当容量大小能有效控制在推荐值范围内，则推荐分辨率VGA及以上 \n
 *       (2)开发过程中按实际情况调试质量，尽量符合推荐值以下大小的截图，过大会影响带宽和加载速度 ! \n
 *       (3)cpv8_filepath作为唯一索引标识用于"mvspt_snapshot_get_data"和"mvspt_snapshot_release"
 */
mv_s32_t  mvspt_thumbnail_snapshot_async(mv_cv8ptr_t cpv8_filepath,  mv_u8_t u8_dchn, mv_s32_t s32_prefer_size);
/**
 * @brief 视频关键帧抓取请求（异步）
 * 
 * @param cpv8_filepath   [in] 目标抓拍文件全路径
 * @param e_vqlty         [in] 抓拍关键帧质量
 * @return 请求执行结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * 
 * @note cpv8_filepath作为唯一索引标识用于"mvspt_snapshot_get_data"和"mvspt_snapshot_release"
 */
mv_s32_t  mvspt_tlv_iframe_snapshot_async(mv_cv8ptr_t cpv8_filepath, mv_u8_t u8_dchn, mvspt_vquality_e e_vqlty);
/**
 * @brief 截图/关键帧数据获取（允许阻塞，有超时要求）
 * 
 * @param cpv8_filepath [in]  目标图片文件全路径
 * @param ppdata        [out] 图片文件数据的缓冲区(取出)
 * @param s32_ext_size  [in]  扩展数据大小（根据数值判断是否需要在图片大小的基础上，额外前/后扩充ext_size进行内存分配）
 * @param ts_timeout_ms [in]  超时时间（毫秒）
 * @return 获取结果
 * - success : >0 (数据缓冲区长度) 
 * -  failed : else
 * 
 * @note s32_ext_size < 0时，表示向前扩充abs(s32_ext_size)大小； s32_ext_size > 0时，表示向后扩充s32_ext_size大小
 */
mv_s32_t  mvspt_snapshot_get_data(mv_cv8ptr_t cpv8_filepath, mv_vptr_t *ppdata, mv_s32_t s32_ext_size, mv_time_t ts_timeout_ms);
/**
 * @brief 截图/关键帧数据释放
 * 
 * @param cpv8_filepath [in] 可释放的目标图片文件全路径
 * @param ppdata        [in] 可释放的图片文件数据的缓冲区
 * @return 执行结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 */
mv_s32_t  mvspt_snapshot_release (mv_cv8ptr_t cpv8_filepath, mv_vptr_t pdata);
/*******************************
 *    录像数据 Porting APIs
 ******************************/
/** 录像文件及列表搜索处理接口 */
typedef enum _pt_recfile_rtype
{
	MVSPT_REC_RTYPE_INVALID     = 0x00,
	MVSPT_REC_RTYPE_SPONTANEOUS = 0x01, ///< 连续录像
	MVSPT_REC_RTYPE_EVENT       = 0x02, ///< 事件录像
    MVSPT_REC_RTYPE_SUMMARY     = 0X04, ///< 浓缩录像(优先于"连续录像"生效)
	MVSPT_REC_RTYPE_ALL         = 0x0f,

#define ETYPE2RTYPE(etype)        (mv_u32_t)(1<<(etype+3)) ///< gattr_alert_filter_e
    MVSPT_REC_RTYPE_EVENT_MOTION        = ETYPE2RTYPE(ABL_ALERT_FILTER_MOTION),
    MVSPT_REC_RTYPE_EVENT_PERSON_STAY   = ETYPE2RTYPE(ABL_ALERT_FILTER_STAY),
    MVSPT_REC_RTYPE_EVENT_EFENCE_ENTER  = ETYPE2RTYPE(ABL_ALERT_FILTER_EFENCE_ENTER),
    MVSPT_REC_RTYPE_EVENT_EFENCE_EXIT   = ETYPE2RTYPE(ABL_ALERT_FILTER_EFENCE_EXIT),
    MVSPT_REC_RTYPE_EVENT_LINE_CROSSING = ETYPE2RTYPE(ABL_ALERT_FILTER_LINE_CROSSING),
    MVSPT_REC_RTYPE_EVENT_BABYCRY       = ETYPE2RTYPE(ABL_ALERT_FILTER_BABYCRY),
    MVSPT_REC_RTYPE_EVENT_PERSON        = ETYPE2RTYPE(ABL_ALERT_FILTER_PERSON),
    MVSPT_REC_RTYPE_EVENT_SMOKE         = ETYPE2RTYPE(ABL_ALERT_FILTER_SMOKE),
}mvspt_recfile_rt_e;  ///< 录像类型综合枚举

typedef enum _pt_recfile_list_mode
{
	MVSPT_RECFILE_LM_INVALID     = 0,
	MVSPT_RECFILE_LM_BRIEF       = 1, ///< 简述（日历）模式
	MVSPT_RECFILE_LM_LIST        = 2, ///< 列表模式
	MVSPT_RECFILE_LM_EVENT       = 3, ///< 事件模式（列表模式的事件类型细分补充）
}mvspt_recfile_lm_e;

typedef enum _pt_recfile_state
{
    MVSPT_RECFILE_STATE_INVALID  = 0,
    MVSPT_RECFILE_STATE_LOCKED   = 1, ///< 该文件被锁定
}mvspt_recfile_state_e;

typedef struct _pt_recfile_item
{
	mv_s64_t ts_start_ms;             ///< 开始时间(UTC0, 毫秒)
	mv_u32_t u32_duration_ms;         ///< 持续时长(毫秒)
	mv_u32_t u32_type;                ///< 内容类型[mvspt_recfile_rt_e]
    mv_u32_t u32_state;               ///< 文件状态([mvspt_recfile_state_e], 仅LM_LIST需要处理)
}mvspt_recfile_item_t;

/** 返回简报（日历）搜索结果，每一个月的结果返回一次 */
typedef struct _pt_recfile_brief
{
    mv_s32_t s32_ym;                  ///< 年月数值序列化(YYYYMM)
	mv_u32_t u32_mcalendar;           ///< 搜索结果月历缓存，每日按位偏移 (1<<(MDay-1)) 代表当天有录像
}mvspt_recfile_brief_t;

typedef struct _pt_recfile_search
{
	mv_u8_t    u8_dchn;               ///< 设备通道
	mv_u8_t    u8_mode;               ///< 搜索方式 [mvspt_recfile_lm_e]
	mv_u32_t   u32_filter;            ///< 类型过滤器，结果包含哪些类型 [mvspt_recfile_rt_e]
	mv_s64_t   ts_start_ms;           ///< 搜索开始时间点(UTC0)
	mv_s64_t   ts_end_ms;             ///< 搜索结束时间点(UTC0)
    mv_cvptr_t cphdl_pick_resolve;    ///< （SDK内部使用）
    mv_vptr_t  p_usr_data;            ///< 用户自定义数据
    mv_s32_t(*f_on_result_picked)(struct _pt_recfile_search *phdl, mv_vptr_t presult);
}mvspt_recfile_search_t;
mv_s32_t  mvspt_recfile_search(mv_u8_t u8_sid, mvspt_recfile_search_t *p);

/** 录像回放处理接口 */
typedef struct _pt_recfile_info
{
	mvspt_recfile_item_t stru_item;
	mvdef_media_bp_t     stru_mbp;
	mvspt_pano_attr_t    stru_pano;
}mvspt_recfile_info_t;
mv_s32_t mvspt_recfile_play(mv_u8_t u8_sid, mv_vptr_t *phdl, mv_s64_t s64_sts, mv_s64_t s64_pts, mv_u8_t u8_dchn, mv_u8_t u8_auto);
mv_s32_t mvspt_recfile_info(mv_u8_t u8_sid, mv_vptr_t  phdl, mvspt_recfile_info_t *pinfo);
mv_s32_t mvspt_recfile_get_next_frame(mv_u8_t u8_sid, mv_vptr_t phdl, mvdef_media_dbi_t *pmdi);
mv_s32_t mvspt_recfile_stop(mv_u8_t u8_sid, mv_vptr_t *phdl);

/*******************************
 *    VFP文件传输 Porting APIs
 ******************************/
#define MVSPT_VFP_RAW  1
typedef struct _vfp_info {
	mv_u8_t    u8_dchn;
	mv_u8_t    u8_ftype; ///< vf 类型, 目前仅支持 MVSPT_VFP_RAW(send prepare时需要porting填充)
	mv_off_t   off_vf;
	mv_v8ptr_t pv8_vfp;
	/** 以下参数send prepare时需要porting填充 */
	mv_size_t  sz_vf;
	mv_u8_t    au8_md5[16];
	mv_v8ptr_t pv8_ext_info;
}mvspt_vfp_info_t;
/** 对端从本端下载 */
mv_s32_t mvspt_vfp_send_prepare(mv_u8_t u8_sid, mv_vptr_t *phdl, mvspt_vfp_info_t *pinfo);
/** MV_EC_SUCCESS / MV_EC_OUTOF_RANGE(EOF) / MV_EC_INVALID_ARGS / MV_EC_FILE_NOT_EXIST */
mv_s32_t mvspt_vfp_send_process(mv_u8_t u8_sid, mv_vptr_t *phdl, mv_v8ptr_t pv8_data, mv_s32_t s32_size);

/** 对端上传到本端 */
mv_s32_t mvspt_vfp_recv_prepare(mv_u8_t u8_sid, mv_vptr_t *phdl, mvspt_vfp_info_t *pinfo);
mv_s32_t mvspt_vfp_recv_process(mv_u8_t u8_sid, mv_vptr_t *phdl, mv_v8ptr_t pv8_data, mv_s32_t s32_len);

/** MV_EC_SUCCESS / MV_EC_NOT_MATCH */
mv_s32_t mvspt_vfp_process_end(mv_u8_t u8_sid, mv_vptr_t *phdl);

/*******************************
 *    报警相关 Porting APIs
 ******************************/
/**
 * @brief 布撤防总开关状态
 * 
 * @param pbl_sw [out] 提取当前布撤防总开关状态(MV_TRUE=布防, MV_FALSE=撤防)
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : else(< 0)
 */
mv_s32_t mvspt_alarm_status(mv_bool_t *pbl_sw);

/*******************************
 *    OTA相关 Porting APIs
 ******************************/
typedef enum _ota_mode
{
    MVS_OTA_NORMAL  = 0,              ///< 普通更新
    MVS_OTA_FORCE   = 1,              ///< 强制更新
    MVS_OTA_SILENCE = 2,              ///< 静默更新
}mvs_ota_mode_e;

typedef struct _ota_info
{
    mv_bool_t  bl_available;          ///< 是否有可用更新
    mv_s64_t   s64_update_id;         ///< 更新标识
    mv_s32_t   s32_upload_id;         ///< 数据ID
    mv_s32_t   s32_update_type;       ///< 更新类型
    mv_s32_t   s32_auto_update_hms;   ///< 自动(强制)更新预定时间<hhmmss>
    mv_u8_t    u8_mode;               ///< 模式bitmap [mvs_ota_mode_e]
    mv_v8_t    av8_md5_str[33];       ///< package的MD5字符串
    mv_s32_t   s32_package_size;      ///< package的大小
    mv_v8ptr_t pv8_package_url;       ///< package的下载链接(注意：使用完后，需要手动释放内存！）
}mvs_ota_info_t;

typedef enum _ota_state
{
    MVS_OTA_INSTALLED_FAILED =  -2,      ///< 安装失败
    MVS_OTA_DOWNLOAD_FAILED  =  -1,      ///< 下载失败
    MVS_OTA_IDLE             =   0,      ///< 空闲
    MVS_OTA_START            =   1,      ///< 开始
    MVS_OTA_DOWNLOADED       =   2,      ///< 下载完毕
    MVS_OTA_INSTALLED        =   3,      ///< 安装完毕
    MVS_OTA_BUSY             =   4,      ///< 繁忙
}mvs_ota_state_e;
/**
 * @brief OTA状态通知处理接口
 * 
 * @param pstru_info [in] OTA信息结构
 * @param s32_state  [in] 状态值 [mvs_ota_state_e]
 * @return 处理结果
 * - success : MV_EC_SUCCESS
 * -  failed : else 
 */
mv_s32_t mvspt_ota_state(mvs_ota_info_t *pstru_info, mv_s32_t s32_state);
/**
 * @brief OTA下载数据处理接口
 * 
 * @param pstru_info [in] OTA信息结构
 * @param s32_offset [in] >0时需要按此位置重新定位数据位置续写
 * @param pv8_data   [in] 数据地址
 * @param s32_len    [in] 数据长度
 * @return 处理结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 */
mv_s32_t mvspt_ota_ondata(mvs_ota_info_t *pstru_info, mv_s32_t s32_offset, mv_v8ptr_t pv8_data, mv_s32_t s32_len);
/**
 * @brief OTA安装操作处理接口
 * 
 * @param pstru_info       [in] OTA信息结构
 * @param pu32_new_version [out]安装成功后的新版本号
 * @return 处理结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * @note 特别的，当需要使用分离式安装（安装过程需要退出本服务）的时候，pu32_new_version返回 0 即可
 */
mv_s32_t mvspt_ota_upgrade(mvs_ota_info_t *pstru_info, mv_u32ptr_t pu32_new_version);
/*****************************
 * 
 *   低功耗相关PortingAPIs
 * 
 ****************************/
typedef enum _boot_type
{
    MVS_BOOT_TYPE_UNKNOWN = -1,     ///< 未知启动，表示未初始化结果（内部会等待直到有有效数值）
    MVS_BOOT_TYPE_NORMAL  = 0,      ///< 正常启动
    MVS_BOOT_TYPE_POWERON,          ///< 上电启动
    MVS_BOOT_TYPE_WAKEUP,           ///< 唤醒启动
    MVS_BOOT_TYPE_RESET,            ///< 复位启动
}mvs_boot_type_e;
/**
 * @brief 启动类型查询接口
 * 
 * @return 启动类型 [mvs_boot_type_e]
 * @note 请根据实际情况返回本次启动类型，低功耗设备需要实现此接口
 */
mv_s32_t mvspt_boot_type(mv_void_t);

MVCXX_EXTERN_END

#endif
